home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / MathLink / MLExample_4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-19  |  3.2 KB  |  168 lines

  1. #include <stdio.h>
  2. #import "/LocalApps/Mathematica.app/Library/Mathematica/MathLink/Includes/mathlink.h"
  3.  
  4. #define DEBUG FALSE
  5.  
  6. void  error(MLINK);
  7. void  read_and_print_expression(MLINK);
  8. int   ReadPacket(MLINK);
  9.  
  10. void main()
  11. {
  12.     MLMain();
  13. }
  14.  
  15. char * FixTeX(char *instring)
  16. {    
  17.     char *temp,*rtnstring;
  18.  
  19.     temp    = (char *) malloc((strlen(instring)+100)*sizeof(char));    
  20.  
  21.     strcpy(temp,"ToString[TeXForm[");
  22.     strcat(temp, instring);
  23.     strcat(temp,"]]\n");
  24.     
  25.     MLEvaluate(temp);
  26.  
  27.     while (MLNextPacket(stdlink) != RETURNPKT)
  28.       MLNewPacket(stdlink);
  29.     MLGetNext(stdlink);
  30.     MLGetString(stdlink,&rtnstring);
  31.     
  32.     strcpy(temp,"$$\n");
  33.     strcat(temp,rtnstring);
  34.     strcat(temp,"\n$$\n\\bye\n");
  35.     
  36.     MLPutString(stdlink,temp);
  37.     MLEndPacket(stdlink);
  38.     
  39.     free(temp);
  40. }  
  41.  
  42. void  error( mlp) MLINK mlp;
  43. {
  44.     fprintf( stderr, "\nerror: %s\n", MLErrorMessage( mlp));
  45.     MLClose( mlp);
  46.     exit( 0);
  47. }  /* error */
  48.  
  49. void  read_and_print_expression( p) MLINK p;
  50. {
  51.     char  *s;
  52.     int    n, i, len;
  53.     double r;
  54.     static int indent;
  55.     
  56.     i=MLGetNext(p);
  57.     fprintf(stderr, "Packet type = %d\n",i);
  58.     
  59.     switch (i) {    
  60.     case MLTKSYM:
  61.         MLGetSymbol( p, &s);
  62.         fprintf( stderr, "%s ", s);
  63.         break;
  64.     case MLTKSTR:
  65.         MLGetString( p, &s);
  66.         fprintf( stderr, "\"%s\" ", s);
  67.         break;
  68.     case MLTKINT:
  69.         MLGetInteger( p, &n);
  70.         fprintf( stderr, "%d ", n);
  71.         break;
  72.     case MLTKREAL:
  73.         MLGetReal( p, &r);
  74.         fprintf( stderr, "%f ", r);
  75.         break;
  76.     case MLTKFUNC:
  77.         indent += 3;
  78.         fprintf( stderr, "\n %*.*s", indent, indent, "");
  79.         if (MLGetArgCount( p, &len) == 0) {
  80.             error( p);
  81.         }else{
  82.             read_and_print_expression(p);
  83.             fprintf( stderr, "[");
  84.             for (i = 1; i <= len; ++i) {
  85.                 read_and_print_expression(p);
  86.                 if (i != len) fprintf( stderr, ", ");
  87.             }
  88.             fprintf( stderr, "]");
  89.         }
  90.         indent -= 3;
  91.         break;
  92.     case MLTKERROR:
  93.     default:
  94.         error( p);
  95.     }
  96. }  /* read_and_print_expression */
  97.  
  98.  
  99. int   ReadPacket( mlp)  MLINK mlp;
  100. {    int code;
  101.     int len = 1;
  102.  
  103.     switch (code = MLNextPacket(mlp)) {
  104.     case INPUTPKT:
  105.         fprintf( stderr, "<INPUTPKT>");
  106.         break;
  107.     case OUTPUTPKT:
  108.         fprintf( stderr, "<OUTPUTPKT>");
  109.         break;
  110.     case TEXTPKT:
  111.         if (DEBUG) fprintf( stderr, "<TEXTPKT>");
  112.         break;
  113.     case RETURNPKT:
  114.         fprintf( stderr, "Result (expression):");
  115.         break;
  116.     case RETURNTEXTPKT:
  117.         fprintf( stderr, "=");
  118.         break;
  119.     case MESSAGEPKT:
  120.         len = 2;
  121.         fprintf( stderr, "\nMessage packet:");
  122.         break;
  123.     case CALLPKT:
  124.         fprintf( stderr, "<CALLPKT>");
  125.         break;
  126.     case INPUTNAMEPKT:
  127.         fprintf( stderr, "\n");
  128.         break;
  129.     case OUTPUTNAMEPKT:
  130.         if (DEBUG) fprintf( stderr, "<OUTPUTNAMEPKT>");
  131.         break;   
  132.     case CONTROLPKT:
  133.         fprintf( stderr, "<CONTROLPKT>");
  134.         break;   
  135.     case SYNTAXPKT:
  136.         fprintf( stderr, "<SYNTAXERROR>");
  137.         break;   
  138.     default:
  139.         fprintf( stderr, "unknown packet \"%d\"\n", code);
  140.         return 0;
  141.     }
  142.     while (len --) {
  143.         read_and_print_expression( mlp);
  144.     }
  145.     if ((code != INPUTNAMEPKT) && (code != OUTPUTNAMEPKT)) {
  146.         fprintf( stderr, "\n");
  147.     }
  148.     return code;
  149. }  /* ReadPacket */
  150.  
  151. /*******************************************/
  152. /* Search for string t in string s         */
  153. /* Return position if found, otherwise -1  */
  154. /*******************************************/
  155. int instr(s,t)
  156. char *s,*t;
  157. {
  158.      int i,j,k;
  159.      
  160.      for (i=0 ; s[i] && t[0] ; i++)
  161.      {
  162.          for (j=i , k=0 ; t[k] && s[j] == t[k] ; j++ , k++);
  163.         if (!t[k]) 
  164.            return(i);
  165.      }
  166.      return(-1);
  167. }
  168.